package com.code.test.second.hash;

import java.util.Arrays;

/**
 * 242.有效的字母异位词
 * 力扣题目链接
 * <p>
 * 给定两个字符串 s 和 t ，编写一个函数来判断 t 是否是 s 的字母异位词。
 * <p>
 * 示例 1: 输入: s = "anagram", t = "nagaram" 输出: true
 * <p>
 * 示例 2: 输入: s = "rat", t = "car" 输出: false
 * <p>
 * 说明: 你可以假设字符串只包含小写字母。
 */
public class SCode242 {
    public static void main(String[] args) {
        String s1 = "anagram";
        String s2 = "nagaram";

        System.out.println(isAnagram(s1, s2));
    }

    /**
     * 什么是异位词：字母异位词指字母相同，但排列不同的字符串。
     * https://blog.51cto.com/u_16213312/7476076
     */
    public static boolean isAnagram(String s1, String s2) {
        /**
         * 统计s1,每个字符出现的次数，存到map
         * 统计s2,每次字符出现的次数，然后把map的该字符数量-1
         * map大小为26个字符就可以了，因为统计的是字母
         *
         * 由于要统计的是s1出现的各字母，是否同时在s2也完全出现，只是顺序不一样
         * 所以s1先存,s2减掉
         * 然后遍历map结果，只要还有剩就不是异位词
         */

        int[] letterMap = new int[26];
        for (int i = 0; i < s1.length(); i++) {
            char c1 = s1.charAt(i);
            //题目有写是小写字母
            //所以这里每个字符-'a',即可得出与'a'的差值，即 'a'-'a'=0,'b'-'a=1,可得出数组下标
            //每个字符都是有Unicode编码表示，每个字符都有唯一的整数，
            letterMap[c1 - 'a']++;
        }

        for (int i = 0; i < s2.length(); i++) {
            char c1 = s1.charAt(i);
            letterMap[c1 - 'a']--;
        }

        for (int count : letterMap) {
            if (count != 0) {
                return false;
            }
        }
        return true;
    }
}
